package com.jjy.controller;

import javax.servlet.http.HttpServletRequest;
import com.jjy.pojo.User;
import com.jjy.service.impl.UserServiceImpl;
import com.jjy.tools.dto.RegistrationDto;
import com.jjy.tools.encrypt.SHAencrypt;
import com.jjy.tools.validation.impl.LoginValidation;
import com.jjy.tools.validation.impl.RegisterValidation;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import java.util.List;

@Controller
public class LoginController {

  @Resource
  private UserServiceImpl userServiceImpl;

  /*前往注册页面*/
  @RequestMapping("/registerPage")
  public String goToRegisterPage(HttpServletRequest request,Model model) {
    return "login/register";
  }

  /*注册请求 ajax*/
  @RequestMapping("/registerRequest")
  public String registerRequest(HttpServletRequest request,Model model) throws Exception {
    //1.先去验证
    RegisterValidation registerValidation = new RegisterValidation();
    Boolean isValid = registerValidation.doValidation(request , userServiceImpl);
    //2.验证通过后,dto转换为实体对象
    if (isValid) {
      User user = RegistrationDto.getUserFromRegister(request , model);
      //3.用service对象将实体对象存储到数据库
      int DB_Status = userServiceImpl.createUser(user);
      //4.存储到数据库成功后(SqlSession的增删改等操作成功返回1,失败返回0),就将此对象存储到session,然后跳转到首页,否则,就跳转到错误页面.
      if (DB_Status == 1){
        return "redirect:/indexPage";
      } else {
        //5.数据库插入数据失败,写进log,返回error页面
        return "error";
      }
    } else {
      //6.验证不成功,直接绑定验证错误信息,然后返回注册页面.
      model.addAttribute("errorMessageJson" , registerValidation.getRegisterErrorMessage().getJson());
      return "login/register";
    }

  }

  /*前往首页*/
  @RequestMapping("/indexPage")
  public String goToIndexPage(HttpServletRequest request,Model model)
  {
    return "backend/index";
  }

  /*前往登录页面*/
  @RequestMapping("/loginPage")
  public String goToLoginPage(HttpServletRequest request,Model model)
  {
    User user = userServiceImpl.selectUserById(1);
    model.addAttribute("user" , user);
    return "login/login";
  }

  /*登录请求 , ajax*/
  @RequestMapping("/loginRequest")
  @ResponseBody
  public String loginRequest(HttpServletRequest request, User user,Model model) throws Exception {
    //先去验证
    LoginValidation loginValidation = new LoginValidation();
    Boolean isValid = loginValidation.doValidation(request , userServiceImpl);
    user.setPassword(SHAencrypt.encryptString(user.getPassword()));
    if(isValid){
      //再去数据库比对
      List<User> users = userServiceImpl.selectUserByParams(user);
      //如果账号密码正确,就将账号信息保存到session , 由页面的ajax重定向到首页,不正确则绑定错误信息并且返回错误信息.
      if(users != null && users.size() > 0){
        return "ok";
      } else {
        return "Account or password error!";
      }
    } else {
      model.addAttribute("errorMessageJson" , loginValidation.getRegisterErrorMessage().getJson());
      return "Account or password invalid!";
    }

  }
  /*
  @RequestBody
  在使用 @RequestMapping后，返回值通常解析为跳转路径，但是加上 @ResponseBody 后返回结果不会被解析为跳转路径，
  而是直接写入 HTTP response body 中。 比如异步获取 json 数据，加上 @ResponseBody 后，会直接返回 json 数据。
  @RequestBody是作用在形参列表上，用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象，
  封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析，然后封装到形参上。
  @ResponseBody 几乎等同于 response.getWriter.write(JSONObject.fromObject(user).toString()).
    @RequestMapping("/login.do")
    @ResponseBody
    public Object login(@RequestBody User loginUuser, HttpSession session) {
        user = userService.checkLogin(loginUser);
        session.setAttribute("user", user);
        return new JsonResult(user);
    }
   */

  /*
  public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,Exception ex) {
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("exception1",le.getMessage());
        modelAndView.getModel().put("exception2",le.getMessage());
        return modelAndView;
    }
  jsp中${requestScope.exception1}可以取出exception1的值；未确认!
  jsp中${exception2}可以取出exception2的值
   */

  /*
  application对象在Servlet中是ServletContext的实例对象,
  可以在你写的Servlet中通过this.getServletContext();方法来获取一个ServletContext实例对象.
  比如: this.getServletContext().setAttribute("users",userList);
  然后在jsp调用使用application.getAttribute("users");
   */
}

